package student.aistar.day15.thread01;

/**
 * 两种创建线程的区别
 */
public class DifferDemo {
    public static void main(String[] args) {
        //创建两个线程
        //extends Thread方式 - 共享代码, 但是不共享资源

        //为什么不共享?
        //因为每次new 创建一个对象的时候, 都会给非静态属性分配空间以及初始化

//        T1 t1 = new T1();
//        T1 t2 = new T1();
//        t1.setName("线程0");
//        t2.setName("线程1");
//        t1.start();
//        t2.start();

        //两个线程并发 - 同一时间段内多个线程执行
        //线程每次被调度 - 执行 - 看"cpu的心情"




        System.out.println("=======implements Runnable接口的方式=========");
        //为什么可以直接实现资源的共享
        //T2总共被new 了一次 - ticket非静态属性也就值初始化了一次
        Runnable r = new T2();

        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);

        t1.setName("线程0");
        t2.setName("线程1");

        t1.start();
        t2.start();
    }
}

//继承Thread类
class T1 extends Thread{
    /**
     * 调用的该T1类的对象, 操作的不是同一份数据, 因为对象都不一样了,数据怎么可能操作的同一份
     * 因为栈中引用的是不同地址,
     * 10~1
     * 10~1
     *
     * 当调用的属性为static时, 因为静态跟类加载同时进行, 只会操作一次, 只有一份数据
     * 所以电影票ticket能一直减到1; 但因为线程执行速度很快, 可能还是会发生抢资源的现象
     * 10~1
     * 随机一个数字(因为前面一个线程操作动作很快)
     *
     */

    //资源
    //如果设置成了静态变量 - extends Thread 也就可以实现共享代码, 共享资源了
    //所有的对象都会工向静态资源 - 静态资源是类加载的时候被分配空间以及初始化, 在内存中只存在一份
    private  int ticket = 10;
//    private static  int ticket = 10;
    @Override
    public void run() {
        for(int i = 0; i < 10; i++){
            if(ticket > 0) {
                System.out.println(Thread.currentThread().getName() + ": " + ticket--);
//                try {
//                    Thread.sleep(1000);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
            }
        }
    }
}

//继承Runnable接口
class T2 implements Runnable{

    //不需要将资源设置成静态的, 也可以直接实现共享代码并且共享资源
    private int ticket = 10;

    @Override
    public void run() {
        for(int i = 0; i < 10; i++){
            if(ticket > 0) {
                System.out.println(Thread.currentThread().getName() + ":  " + ticket--);

            }
        }
    }
}